package com.zkh.myutils.io.excel.worksheet;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import com.zkh.myutils.io.excel.ExcelUtils;

/**
 * 工作表对象
 * @author zkh
 */
public class Sheet {
	//名称
	private String name;
	//行列表
	private List<Row> rowList;
	//列宽，从左往右依次设置
	private Integer[] columnsWidth;
	//单元格合并
	private TreeMap<String, int[]> mergeRangeMap = new TreeMap<>();
	//冻结行和列的数量
	private int freezeRowNumber, freezeColumeNumber;

	/**
	 * 构造方法
	 * @param name sheet名称
	 */
	public Sheet(String name) {
		this.name = name;
		this.rowList = new ArrayList<>();
	}
	
	/**
	 * 创建行对象并追加到工作表
	 * @return
	 */
	public Row createRow() {
		//初始化行
		Row row = new Row();
		//保存
		rowList.add(row);
		//返回
		return row;
	}
	
	/**
	 * 合并单元格
	 * @param startRow 开始行号
	 * @param endRow 结束行号
	 * @param startCol 开始列号
	 * @param endCol 结束列号
	 */
	public void addMerge(int startRow, int endRow, int startCol, int endCol) {
		//开始位置
		String start = ExcelUtils.getColumnLetter(startCol) + startRow;
		//结束位置
		String end = ExcelUtils.getColumnLetter(endCol) + endRow;
		//位置
		String pos = start + ":" + end;
		//检查key是否存在
		if(!mergeRangeMap.containsKey(pos)) {
			//保存
			mergeRangeMap.put(pos, new int[] {startRow, endRow, startCol, endCol});
		}
	}
	
	/**
	 * 获取合并配置
	 * @return
	 */
	public TreeMap<String, int[]> getMergeMap() {
		return mergeRangeMap;
	}
	
	/**
	 * 设置冻结行。<br>
	 * 注：冻结方法setFreezeRow、setFreezeColume和setFreeze只有最后调用的方法才有效。
	 * @param rowNumber 冻结行数。可以理解为冻结前几行，如rowNumber=1，表示冻结首行，rowNumber=5，表示冻结前5行
	 */
	public void setFreezeRow(int rowNumber) {
		freezeRowNumber = rowNumber;
		freezeColumeNumber = 0;
	}
	
	/**
	 * 设置冻结列。<br>
	 * 注：冻结方法setFreezeRow、setFreezeColume和setFreeze只有最后调用的方法才有效。
	 * @param columeNumber 冻结列数。可以理解为冻结前几列，如columeNumber=1，表示冻结首列，columeNumber=5，表示冻结前5列
	 */
	public void setFreezeColume(int columeNumber) {
		freezeRowNumber = 0;
		freezeColumeNumber = columeNumber;
	}
	
	/**
	 * 设置冻结区域，同时冻结行和列。<br>
	 * 注：冻结方法setFreezeRow、setFreezeColume和setFreeze只有最后调用的方法才有效。
	 * @param rowNumber 冻结行数
	 * @param columeNumber 冻结列数
	 */
	public void setFreeze(int rowNumber, int columeNumber) {
		freezeRowNumber = rowNumber;
		freezeColumeNumber = columeNumber;
	}
	
	/**
	 * 获取冻结区域
	 * @return
	 */
	public int[] getFreeze() {
		return new int[] {freezeRowNumber, freezeColumeNumber};
	}
	
	/**
	 * 设置列宽，按列的顺序依次设置，不设置的列传null即可
	 * @param widths 列宽，从第一列开始设置，单位px
	 */
	public void setColumnsWidth(Integer... widths) {
		this.columnsWidth = widths;
	}
	
	/**
	 * 获取列宽配置
	 * @return
	 */
	public Integer[] getColumnsWidth() {
		return this.columnsWidth;
	}
	
	/**
	 * 获取行对象。获取之前，必须先调用createRow()方法创建行，否则会抛出异常
	 * @param rowNumber 行号，从1开始
	 * @return
	 */
	public Row getRow(int rowNumber) {
		return rowList.get(rowNumber-1);
	}
	
	/**
	 * 获取总行数
	 * @return
	 */
	public int getRows() {
		return rowList.size();
	}
	
	/**
	 * 获取总列数（所有行取最大列数）
	 * @return
	 */
	public int getCols() {
		//临时列数
		int cols = 0;
		//遍历
		for(Row row: rowList) {
			//获取最大列
			if(row.getCols()>cols) cols = row.getCols();
		}
		//返回
		return cols;
	}
	
	/**
	 * 获取sheet名称
	 * @return
	 */
	public String getName() {
		return name;
	}
}
